#ifndef _SQLCONNECTION_
#define _SQLCONNECTION_

#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <mysql/mysql.h>
#include <jsoncpp/json/json.h>

/* 封装 MySQL 连接 */
class SqlConnection
{
public:
    SqlConnection();
    virtual ~SqlConnection();

public:
    /* 使用配置文件中的信息连接数据库, 连接成功放回 true */
    bool connect();             
    /* 重载方法, 运行用户连接指定数据库 */
    bool connect(MYSQL* mysql, const char* host, const char* user, const char* passwd, const char* db, unsigned int port);

    /* 检查是否已经与数据库建立了连接 */
    bool is_open();

    /* 主动断开与数据库的连接 */
    void disconnect();

    /* 创建数据表 */
    bool create_table(const char* stmt_str);
    bool create_table(const std::string& stmt_str);

    /* 插入数据 */
    bool insert(const char* stmt_str);
    bool insert(const std::string& stmt_str);

    /* 更新数据 */
    bool update(const char* stmt_str);
    bool update(const std::string& stmt_str);

    /* 删除数据 */
    bool remove(const char* stmt_str);
    bool remove(const std::string& stmt_str);

    /* 获取指定表的读锁 */
    bool lock_read(const std::string& table_name);

    /* 获取指定表的写锁 */
    bool lock_write(const std::string& table_name);

    /* 释放锁 */
    void unlock();

    /* 查询操作, 返回字段名列表 */
    std::vector<std::string> query(const char* stmt_str);
    /* 重载方法, 避免隐式转换开销 */
    std::vector<std::string> query(const std::string& stmt_str);
    /* 返回查询结果的下一行数据, 为空说明查询结束 */
    std::vector<std::string> next();

    /* 获取连接信息 */
    std::string get_host() const { return host; }
    std::string get_user() const { return user; }
    std::string get_passwd() const { return passwd; }
    std::string get_db() const { return db; }
    unsigned int get_port() const { return port; }

private:
    MYSQL* mysql;               /* 数据库连接句柄 */
    MYSQL_RES* result;          /* 查询结构句柄 */

private:
    std::string host;           /* mysql 主机地址 */
    std::string user;           /* 用户名 */
    std::string passwd;         /* 密码 */
    std::string db;             /* 数据库名 */
    unsigned int port;          /* 端口号 */
};

#endif